//
//  MMGStatusViewModel.swift
//  MyMicroblog
//
//  Created by Mac on 17/1/7.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit

class MMGStatusViewModel: NSObject {

    // 每一条微博都会有一个视图模型来处理数据逻辑,所以不提供单例对象
    // 提供微博作者头像地址,提供用户等级状态图片,提供用户认证类型图片
    var urlAvater: URL?                    // 头像地址
    var verified_typeImage: UIImage?       // 认证类型图片
    var mbrankImage: UIImage?              // 用户等级图片
    var sourceText: String?                // 微博来源字符串
    var timeText: String?                  // 微博发布时间
    
    // 处理微博发布时间
    private func dealTimeText(timeText: String) -> String {
        // 实例化日期格式对象
        let dateFormatter = DateFormatter()
        // 指定格式化符
        dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        // 在真机上需要设置本地化信息,否则转换会失败
        dateFormatter.locale = Locale(identifier: "ZNWB")
        // 转换时间对象
        guard let sinaTime = dateFormatter.date(from: timeText) else {
            return "本条信息来自时空彼岸"
        }
        // 处理时间对象
        let calender = Calendar.current
        let currentDate = Date()
        // 计算当前时间和微博发布时间的差值
        let result = calender.dateComponents([.year,.day], from: sinaTime, to: currentDate)
        if result.year == 0 {
            // 表示在同一年
            // 判断是否同一天
            if calender.isDateInToday(sinaTime){
                // 表示同一天
                let delta = currentDate.timeIntervalSince(sinaTime)
                if delta < 60 {
                    // 表示在同一分钟中
                    return "刚刚"
                }else if delta < 3600 {
                    // 表示在同一小时中
                    return "\(Int(delta / 60)) 分钟前"
                }else {
                    // 一天中一小时之前的某个时刻
                    return "\(Int(delta / 3600)) 小时前"
                }
            }else if calender.isDateInYesterday(sinaTime){
                // 表示昨天
                dateFormatter.dateFormat = "昨天 HH:mm"
            }else {
                // 表示昨天更早之前的某天
                dateFormatter.dateFormat = "MM-dd HH:mm"
            }
        }else{
            // 表示不在同一年
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
        }
        
        return dateFormatter.string(from: sinaTime)
    }
    
    // 处理微博来源
    private func dealSourceText(source: String) -> String {
        // 设置截取字符串范围
        let startFlag = "\">"
        let endFlag = "</a>"
        guard let startRange = source.range(of: startFlag),
            let endRange = source.range(of: endFlag) else {
            return "未知来源"
        }
        let range = startRange.upperBound..<endRange.lowerBound
        let subString = source.substring(with: range)
        return subString
    }
    
    // 处理发布图片信息
    var imageURLs: [MMGPictureInfoDTO]? {
        return status?.retweeted_status == nil ? status?.pic_urls : status?.retweeted_status?.pic_urls
    }
    
    // 处理图片数量
    var imageCount: Int {
        return (status?.retweeted_status == nil ? status?.pic_urls?.count : status?.retweeted_status?.pic_urls?.count) ?? 0
    }
    
    // 拥有 status 模型,处理数据逻辑
    // 当 status 获取数值的时候,直接获取微博作者头像,处理作者状态图片
    var status: MMGStatusDTO? {
        didSet{
            urlAvater = URL(string: (status?.user?.avatar_large) ?? "")
            dealVerified_typeImage()
            dealMbrank()
            sourceText = dealSourceText(source: status?.source ?? "")
            timeText = dealTimeText(timeText: status?.created_at ?? "")
        }
    }
    
    // 处理作者认证图片
    private func dealVerified_typeImage(){
        // 根据 status 中作者的认证类型,为认证图片赋值
        // 作者认证类型:-1：没有认证，0：认证用户，2,3,5: 企业认证，220: 达人
        let verified_type = status?.user?.verified_type ?? -1
        // 判断 type 值
        switch verified_type {
        case 0:
            verified_typeImage = #imageLiteral(resourceName: "avatar_vip")
        case 2,3,5:
            verified_typeImage = #imageLiteral(resourceName: "avatar_enterprise_vip")
        case 220:
            verified_typeImage = #imageLiteral(resourceName: "avatar_grassroot")
        default:
            verified_typeImage = nil
        }
    }
    
    // 处理作者等级图片
    private func dealMbrank() {
        // 根据 status 中作者的等级,为等级图片赋值
        let mbrank = status?.user?.mbrank ?? 0
        if mbrank > 0 && mbrank < 7 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        }
    }
}
